package com.rongmei.jdsync.dto.sync;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Builder;

import java.math.BigDecimal;

/**
 * 批处理结果统计
 * 用于记录单个批次处理的统计信息
 *
 * @author dongjun
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class BatchProcessResult {

    /**
     * 本地找到的商品数量
     */
    private int localFoundCount;

    /**
     * 价格变更的商品数量
     */
    private int priceChangedCount;

    /**
     * 推送成功的商品数量
     */
    private int pushSuccessCount;

    /**
     * 推送失败的商品数量
     */
    private int pushFailedCount;

    /**
     * 价格变更总金额
     */
    private BigDecimal changeAmount;

    /**
     * 创建空的批处理结果
     *
     * @return 空的批处理结果
     */
    public static BatchProcessResult empty() {
        return BatchProcessResult.builder()
                .localFoundCount(0)
                .priceChangedCount(0)
                .pushSuccessCount(0)
                .pushFailedCount(0)
                .changeAmount(BigDecimal.ZERO)
                .build();
    }

    /**
     * 创建只有本地商品但无价格变更的结果
     *
     * @param localFoundCount 本地找到的商品数量
     * @return 批处理结果
     */
    public static BatchProcessResult noChange(int localFoundCount) {
        return BatchProcessResult.builder()
                .localFoundCount(localFoundCount)
                .priceChangedCount(0)
                .pushSuccessCount(0)
                .pushFailedCount(0)
                .changeAmount(BigDecimal.ZERO)
                .build();
    }

    /**
     * 创建全部失败的结果
     *
     * @param failedCount 失败的商品数量
     * @return 批处理结果
     */
    public static BatchProcessResult allFailed(int failedCount) {
        return BatchProcessResult.builder()
                .localFoundCount(0)
                .priceChangedCount(0)
                .pushSuccessCount(0)
                .pushFailedCount(failedCount)
                .changeAmount(BigDecimal.ZERO)
                .build();
    }

    /**
     * 获取总处理数量
     *
     * @return 总处理数量
     */
    public int getTotalProcessedCount() {
        return pushSuccessCount + pushFailedCount;
    }

    /**
     * 计算成功率
     *
     * @return 成功率（0.0 - 1.0）
     */
    public double getSuccessRate() {
        int total = getTotalProcessedCount();
        if (total == 0) return 1.0;
        return (double) pushSuccessCount / total;
    }

    /**
     * 是否有价格变更
     *
     * @return 是否有价格变更
     */
    public boolean hasPriceChanges() {
        return priceChangedCount > 0;
    }

    /**
     * 是否全部成功
     *
     * @return 是否全部成功
     */
    public boolean isAllSuccess() {
        return pushFailedCount == 0 && pushSuccessCount > 0;
    }

    /**
     * 是否全部失败
     *
     * @return 是否全部失败
     */
    public boolean isAllFailed() {
        return pushSuccessCount == 0 && pushFailedCount > 0;
    }

    /**
     * 是否部分成功
     *
     * @return 是否部分成功
     */
    public boolean isPartialSuccess() {
        return pushSuccessCount > 0 && pushFailedCount > 0;
    }

    /**
     * 确保变更金额不为null
     */
    public void ensureChangeAmountNotNull() {
        if (this.changeAmount == null) {
            this.changeAmount = BigDecimal.ZERO;
        }
    }

    @Override
    public String toString() {
        return String.format("BatchProcessResult{本地找到=%d, 价格变更=%d, 推送成功=%d, 推送失败=%d, 变更金额=%s, 成功率=%.2f%%}",
                localFoundCount, priceChangedCount, pushSuccessCount, pushFailedCount,
                changeAmount != null ? changeAmount : "0", getSuccessRate() * 100);
    }
}
